home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / trigrp / trigrp.c < prev    next >
C/C++ Source or Header  |  1992-08-31  |  7KB  |  327 lines

  1. #include "vec4.h"
  2. #include <geom.h>
  3. #include <color.h>
  4. #include <point.h>
  5. #include "trigrp.h"
  6.  
  7. extern ColorA GetCmapEntry();
  8.  
  9.  
  10.     /* order is: 2,3,6 */
  11.     /* use 4-tuples so can use library routines on them */
  12. Transform reftri[NUMGRPS]  = {
  13.    {    /* 233 */
  14.     {1., 0., 0., 1.}, 
  15.     {0.57735, 0.816497, 0., 1.}, 
  16.         {0.57735, 0., 0.816497, 1.},
  17.     {0,0,0,1}},
  18.    {     /* 234 */
  19.     {1., 0., 0., 1.}, 
  20.     {0.816497, 0.57735, 0., 1.}, 
  21.          {0.707107, 0., 0.707107, 1.},
  22.     {0,0,0,1}},
  23.    {    /* 235 */
  24.     {1., 0., 0., 1.}, 
  25.     {0.934172, 0.356822, 0., 1.}, 
  26.         {0.850651, 0., 0.525731, 1.},
  27.     {0,0,0,1}},
  28.     {    /* 236 */
  29.     {0,0,0,1}, 
  30.     {.5,0,0,1}, 
  31.     {0,.866025,0,1},
  32.     {0,0,1,0}},
  33.     {    /* 237 */
  34.     {0.49697043, 0., 0., 1.}, 
  35.     {0.49697043, 0.23932834, 0., 1.}, 
  36.     {0., 0., 0., 1.},
  37.     {0,0,1,0}}
  38.     };
  39.  
  40. Transform reftritp[NUMGRPS];
  41.     /* gl routines expect pointers to floats !!???!! */
  42.     float t236[3][4] = {
  43.      {0,0,0,1}, 
  44.      {.5,0,0,1}, 
  45.      {0,.866025,0,1}};
  46.  
  47.     Transform    ireftri[NUMGRPS];    
  48.     Transform  gens[NUMGRPS][3] = {    /* 4 groups, 3 gens apiece */
  49.     {    /* 233 */
  50.     {
  51.     {0., 0.70710678, 0.70710678, 0.}, 
  52.     {0.70710678, 0.5, -0.5, 0.}, 
  53.          {0.70710678, -0.5, 0.5, 0.}, 
  54.     {0., 0., 0., 1.}}, 
  55.     {
  56.     {1., 0., 0., 0.}, 
  57.     {0., -1., 0., 0.}, 
  58.     {0., 0., 1., 0.}, 
  59.     {0., 0., 0., 1.}}, 
  60.     {
  61.     {1., 0., 0., 0.}, 
  62.     {0., 1., 0., 0.}, 
  63.          {0., 0., -1., 0.}, 
  64.     {0., 0., 0., 1.}}}, 
  65.    {{
  66.     {0.5, 0.70710678, 0.5, 0.}, 
  67.     {0.70710678, 0., -0.70710678, 0.}, 
  68.          {0.5, -0.70710678, 0.5, 0.}, 
  69.     {0., 0., 0., 1.}}, 
  70.     {
  71.     {1., 0., 0., 0.}, 
  72.     {0., -1., 0., 0.}, 
  73.     {0., 0., 1., 0.}, 
  74.          {0., 0., 0., 1.}}, 
  75.    {
  76.     {1., 0., 0., 0.}, 
  77.     {0., 1., 0., 0.}, 
  78.          {0., 0., -1., 0.}, 
  79.     {0., 0., 0., 1.}}}, 
  80.    {{
  81.     {0.80901699, 0.5, 0.30901699, 0.}, 
  82.     {0.5, -0.30901699, -0.80901699, 0.}, 
  83.          {0.30901699, -0.80901699, 0.5, 0.}, 
  84.     {0., 0., 0., 1.}}, 
  85.     {
  86.     {1., 0., 0., 0.}, 
  87.     {0., -1., 0., 0.}, 
  88.     {0., 0., 1., 0.}, 
  89.          {0., 0., 0., 1.}}, 
  90.     {
  91.     {1., 0., 0., 0.}, 
  92.     {0., 1., 0., 0.}, 
  93.          {0., 0., -1., 0.}, 
  94.     {0., 0., 0., 1.}}
  95.     },
  96.  
  97.     {    /* 236 */
  98.      {{-0.5, -0.866026, 0, 0.}, 
  99.       {-0.866026, 0.5, 0, 0.}, 
  100.       {0., 0, 1, 0.}, 
  101.          {0.75, 0.433013, 0, 1.}},
  102.      {{-1,0,0,0},
  103.       {0,1,0,0},
  104.       {0,0,1,0},
  105.       {0,0,0,1}},
  106.      {{1,0,0,0},
  107.       {0,-1,0,0},
  108.       {0,0,1,0},
  109.       {0,0,0,1}}},
  110.     {    /* 237 */
  111.      {{0.6234898, 0.78183148, 0., 0.}, 
  112.       {0.78183148, -0.6234898, 0., 0.}, 
  113.          {0., 0., 1., 0.}, 
  114.       {0., 0., 0., 1.}}, 
  115.        {{1., 0., 0., 0.}, 
  116.       {0., -1., 0., 0.}, 
  117.       {0., 0., 1., 0.}, 
  118.       {0., 0., 0., 1.}}, 
  119.        {{-1.6559706, 0., 0., -1.3199388}, 
  120.       {0., 1., 0., 0.}, 
  121.       {0., 0., 1., 0.}, 
  122.          {1.3199388, 0., 0., 1.6559706}},
  123. /*
  124.        {{-0.5, 0.8660254, 0., 0.}, 
  125.       {0.8660254, 0.5, 0., 0.}, 
  126.       {0., 0., 1., 0.}, 
  127.          {0., 0., 0., 1.}},
  128.      {{-1.3201547, 0., 0., -0.86186338}, 
  129.       {0., 1., 0., 0.}, 
  130.       {0., 0., 1., 0.}, 
  131.          {0.86186338, 0., 0., 1.3201547}}, 
  132.         {{1., 0., 0., 0.},     
  133.       {0., -1., 0., 0.},     
  134.       {0., 0., 1., 0.},     
  135.       {0., 0., 0., 1.}}, 
  136. */
  137.     }
  138.     };
  139.  
  140. Geom *plist = NULL;
  141. Geom *eucplist = NULL;
  142.  
  143. compute_gen()
  144. {
  145.     /* compute the inverse of the reference tri cord system */
  146.     int i, j;
  147.     Transform mm;
  148.     HPoint3 pp1, pp2;
  149.     for (i=0;i<NUMGRPS; ++i) {
  150.         /*TmTranspose(reftri[i], reftritp[i]);*/
  151.         TmInvert(reftri/*tp*/[i], ireftri[i]);
  152.         /* matrices are in the wrong orientation for hg routines */
  153.         /*for (j=0; j<3; ++j)    {
  154.             TmTranspose(gens[i][j], mm);
  155.             TmCopy(mm, gens[i][j]);
  156.         }
  157.         */
  158.     }
  159. }
  160.  
  161. HPoint3 points[7];    /* Vertices in fundamental domain */
  162.  
  163. Geom *
  164. Make2nmFD(bary, active_group, plptr)
  165. HPoint3 bary;
  166. Geom *plptr;
  167. {
  168.     HPoint3 pp, p2, pn, pm;
  169.     Hg4Coord *tp, *tq;    /* images of the point */
  170.     float total;
  171.     int i;
  172.  
  173.     if (active_group >= 0 && active_group < 3)    {    /* spherical triangle */
  174.     Line l1, l2, l3;
  175.     static HPoint3 origin = {0,0,0,1};
  176.     HPoint3 vertex,pt, pp2;
  177.     Plane pl;
  178.  
  179.     PtTransform(reftri/*tp*/[active_group],  &bary, &pp);    
  180.     tp = (Hg4Coord *) &pp;
  181.     NORMALIZE3( tp );  pp.w = 1.0;
  182.     PtTransform(gens[active_group][0],&pp, &p2);
  183.     tq = (Hg4Coord *) &p2;
  184.     MIDPOINT4( tp, tq, tq)
  185.     PtTransform(gens[active_group][1], &pp,&pn);
  186.     tq = (Hg4Coord *)&pn;
  187.     MIDPOINT4(tp, tq, tq)
  188.     PtTransform(gens[active_group][2],&pp,&pm);
  189.     tq = (Hg4Coord *) ±
  190.     MIDPOINT4(tp, tq, tq)
  191.  
  192.     /* in spherical groups, truncate the corner vertices */
  193.     HLn3From2HPt3s(&l2, reftri[active_group][0], &origin);
  194.     /* compute plane equation for pp,pn,pm */
  195.     HLn3From2HPt3s(&l1, &pp, &pn);
  196.     LnDual(&l1, &l1);
  197.     Hg4AntiContractPijQj(&l1, &pm, &pl);
  198.     LnIntersectPl(&l2, &pl, &pp2);
  199.     Hg4Normalize(&pp2,&pp2);
  200.     points[0] = pp2;
  201.     
  202.     HLn3From2HPt3s(&l2, reftri[active_group][1], &origin);
  203.     /* compute plane equation for pp,pm,p2 */
  204.     HLn3From2HPt3s(&l1, &pp, &pm);
  205.     LnDual(&l1, &l1);
  206.     Hg4AntiContractPijQj(&l1, &p2, &pl);
  207.     LnIntersectPl(&l2, &pl, &pp2);
  208.     Hg4Normalize(&pp2,&pp2);
  209.     points[1] = pp2;
  210.     
  211.     HLn3From2HPt3s(&l2, reftri[active_group][2], &origin);
  212.     /* compute plane equation for pp,p2,pn */
  213.     HLn3From2HPt3s(&l1, &pp, &p2);
  214.     LnDual(&l1, &l1);
  215.     Hg4AntiContractPijQj(&l1, &pn, &pl);
  216.     LnIntersectPl(&l2, &pl, &pp2);
  217.     Hg4Normalize(&pp2,&pp2);
  218.     points[2] = pp2;
  219.     
  220.     } else if (active_group == G_236)    {
  221.     PtTransform(reftri/*tp*/[active_group],  &bary, &pp);    
  222.     tp = (Hg4Coord *) &pp;
  223.     PtTransform(gens[active_group][0],&pp, &p2);
  224.     tq = (Hg4Coord *) &p2;
  225.     MIDPOINT4( tp, tq, tq)
  226.     PtTransform(gens[active_group][1], &pp,&pn);
  227.     tq = (Hg4Coord *) &pn;
  228.     MIDPOINT4(tp, tq, tq)
  229.     PtTransform(gens[active_group][2],&pp,&pm);
  230.     tq = (Hg4Coord *) ±
  231.     MIDPOINT4(tp, tq, tq)
  232.     for (i=0; i<3; ++i)
  233.         points[i] = *(HPoint3 *)reftri[active_group][i];
  234.     } else {    /* hyperbolic */
  235.     /* need to replace these midpoint routines with genuine hyp stuff */
  236.     PtTransform(reftri/*tp*/[active_group],  &bary, &pp);    
  237.     tp = (Hg4Coord *) &pp;
  238.     Hg4Normalize(tp,tp);
  239.  
  240.     PtTransform(gens[active_group][0],&pp, &p2);
  241.     tq = (Hg4Coord *) &p2;
  242.     midpoint31( tp, tq, tq);
  243.     PROJECT4(tq);
  244.  
  245.     PtTransform(gens[active_group][1], &pp,&pn);
  246.     tq = (Hg4Coord *)&pn;
  247.     midpoint31(tp, tq, tq);
  248.     PROJECT4(tq);
  249.  
  250.     PtTransform(gens[active_group][2],&pp,&pm);
  251.     tq = (Hg4Coord *) ±
  252.     midpoint31(tp, tq, tq);
  253.     PROJECT4(tq);
  254.  
  255.  
  256.     for (i=0; i<3; ++i)
  257.         points[i] = *(HPoint3 *)reftri[active_group][i];
  258.     }
  259.  
  260.     /* stuff 4 moving vertices into struct */
  261.     /* order is :  pp, p2, pn, pm */
  262.     points[3] = pp;
  263.     points[4] = p2;
  264.     points[5] = pn;
  265.     points[6] = pm;
  266.     GeomCCreate(plptr, (GeomClass *)NULL, CR_POINT4, points, CR_END);
  267. }
  268.  
  269. extern Geom *obj[];
  270.  
  271.     /* this is the indices of the vertices inthe 3 quads we produce */
  272. static table[3][4] = {
  273.     5,3,6,0,
  274.     4,1,6,3,
  275.     5,2,4,3
  276. };
  277.  
  278. init_plist(active_group)
  279. {
  280.     int i,j;
  281.     static int threequads[3] = { 4,4,4 };
  282.     ColorA facecolors[3];
  283.     extern GeomClass *PolyListMethods();
  284.  
  285.     for (i=0; i<3; ++i)
  286.     points[i] = *(HPoint3 *)reftri[active_group][i];
  287.  
  288.     for (i=3; i<7; ++i)            /* Clone distinguished point */
  289.     points[i] = points[0];
  290.  
  291.     if (plist == NULL)    {
  292.     for(i = 0; i < 3; i++)
  293.         facecolors[i] = GetCmapEntry(i);
  294.  
  295.     plist = GeomCCreate(NULL, PolyListMethods(),
  296.         CR_NPOLY, 3,
  297.         CR_NVERT, threequads,
  298.         CR_VERT, table,
  299.         CR_POLYCOLOR, facecolors,
  300.         CR_POINT4, points,
  301.         CR_END);
  302.     eucplist = GeomCopy(plist);
  303.     } else {
  304.     /* Update vertices */
  305.     GeomCCreate(plist, (GeomClass *)NULL,  CR_POINT4, points, CR_END);
  306.     }
  307. }
  308.  
  309. midpoint31(p0,p1,m)
  310. Hg4Coord *p0, *p1, *m;
  311. {
  312.     float m0,m1;
  313.     int i;
  314.     Hg4Coord p2[4];
  315.  
  316.     VSUB4(p0, p1, p2)
  317.     if (VISZERO4(p2))    
  318.     VCOPY4(p0, m)
  319.     else
  320.     {
  321.     m0 = INPRO31(p0, p2);
  322.     m1 = INPRO31(p1, p2);
  323.     for (i=0; i<4; ++i)    
  324.         m[i] = m1*p0[i] - m0*p1[i];
  325.     }
  326. }
  327.